home *** CD-ROM | disk | FTP | other *** search
/ BCI NET / BCI NET Dec 94.iso / archives / utilities / text / entab10.lha / entab / entab.c next >
Encoding:
C/C++ Source or Header  |  1994-02-21  |  5.1 KB  |  253 lines

  1. /*
  2.  * entab.c - add tabs to a text file
  3.  * by Bruce Momjian (root@candle.uucp)
  4.  * ANSIfied and Amigaized by
  5.  * Jörgen Grahn
  6.  * Amiga version 1.0 1994-02-20
  7.  * Below follows original code by Momjian,
  8.  * modified as required.
  9.  *
  10.  */
  11.  
  12. /*
  13. **    entab.c        - add tabs to a text file
  14. **    by Bruce Momjian (root@candle.uucp)
  15. **
  16. **  version 0.9
  17. **
  18. **    tabsize = 4
  19. **
  20. */
  21.  
  22. #include <exec/types.h>
  23. #include <dos/rdargs.h>
  24. #include <clib/exec_protos.h>
  25. #include <clib/dos_protos.h>
  26. #include <clib/utility_protos.h>
  27.  
  28. #ifdef LATTICE
  29. #include <proto/exec.h>
  30. #include <proto/dos.h>
  31. #include <proto/utility.h>
  32. #endif
  33.  
  34. #include <stddef.h>
  35. #include <stdio.h>
  36. #include <stdlib.h>
  37. #include <string.h>
  38.  
  39. #define NUL        '\0'
  40.  
  41. #ifndef TRUE
  42. #define    TRUE     1
  43. #endif
  44. #ifndef FALSE
  45. #define FALSE    0
  46. #endif
  47.  
  48. extern struct SysBase        * SysBase;
  49. extern struct DosLibrary    * DOSBase;
  50. extern struct Library        * UtilityBase;
  51.  
  52. static char template[] =
  53.     "NOTRAIL/S,DETAB/S,QUOTE/S,MINSPACE/N/K,TABSIZE/N/K,FILES/M";
  54.  
  55. static LONG    minspace = 2;
  56. static LONG    tabsize = 8;
  57.  
  58. static char    * defaultnames[] = {NULL};
  59.  
  60. static LONG result[6] =
  61.     {(LONG)FALSE, (LONG)FALSE, (LONG)FALSE,
  62.         (LONG)&minspace, (LONG)&tabsize, (LONG)NULL};
  63.  
  64. static const char versionstring[] =    "$VER: entab 1.0 (20.2.94) "
  65.                                     "Bruce Momjian/Jörgen Grahn";
  66.  
  67. int main(int argc, char **argv)
  68. {
  69.     int    tab_size,
  70.         min_spaces,
  71.         protect_quotes,
  72.         del_tabs,
  73.         clip_lines;
  74.  
  75. int        prv_spaces,
  76.         col_in_tab,
  77.         escaped,
  78.         nxt_spaces;
  79.     char in_line[BUFSIZ],
  80.          out_line[BUFSIZ],
  81.          *src,
  82.          *dst,
  83.          quote_char,
  84.          *cp;
  85.     FILE    *in_file;
  86.  
  87.     struct RDArgs     * anchor;
  88.     char            ** name;
  89.  
  90.     if(DOSBase->dl_lib.lib_Version < 36)
  91.     {    exit(20);
  92.     }
  93.  
  94.     UtilityBase = OpenLibrary("utility.library", 36);
  95.     if(UtilityBase==NULL)
  96.     {    exit(20);
  97.     }
  98.  
  99.     cp = FilePart(argv[0]);
  100.  
  101.     if(Stricmp(cp,"detab")==0)
  102.     {    result[1] = (LONG)TRUE;
  103.     }
  104.                                                                   
  105.     anchor = ReadArgs(template, result, NULL);
  106.     if(anchor==NULL)
  107.     {    CloseLibrary(UtilityBase);
  108.         exit(10);
  109.     }
  110.  
  111. #ifdef DEBUG
  112.     printf("tab_size %ld, min_spaces %ld, protect_quotes %ld, del_tabs %ld, clip_lines %ld\n",
  113.         *(LONG *)result[4], *(LONG *)result[3], result[2], result[1], result[0]);
  114. #endif
  115.  
  116.     tab_size = *(LONG *)result[4],
  117.     min_spaces = *(LONG *)result[3],
  118.     protect_quotes = result[2],
  119.     del_tabs = result[1],
  120.     clip_lines = result[0];
  121.     name = (char **)result[5];
  122.  
  123.     do
  124.     {
  125.         if(result[5]==0)
  126.         {    in_file = stdin;
  127.         }
  128.         else
  129.         {    if((in_file=fopen(*name,"r")) == NULL)
  130.             {    fprintf(stderr, "Error: Can not open file %s\n", *name);
  131.                 name++;
  132.                 continue;
  133.             }
  134.             else
  135.             {    name++;
  136.             }
  137.         }
  138.  
  139.         escaped = FALSE;
  140.  
  141.         while(fgets(in_line, BUFSIZ, in_file) != NULL)
  142.         {
  143.             col_in_tab = 0;
  144.             prv_spaces = 0;
  145.             src = in_line;        /* points to current processed char */
  146.             dst = out_line;        /* points to next unallocated char */
  147.             if(!escaped)
  148.                 quote_char = ' ';
  149.             escaped = FALSE;
  150.             while(*src != NUL)
  151.             {
  152.                 col_in_tab++;
  153.                 if (*src == ' ' || *src == '\t')
  154.                 {
  155.                     if (*src == '\t')
  156.                     {
  157.                         prv_spaces = prv_spaces + tab_size - col_in_tab + 1;
  158.                         col_in_tab = tab_size;
  159.                     }
  160.                     else
  161.                         prv_spaces++;
  162.  
  163.                     if (col_in_tab == tab_size)
  164.                     {
  165.                         /* Is the next character going to be a tab?
  166.                            Needed to do tab replacement in current spot if
  167.                            next char is going to be a tab, ignoring
  168.                            min_spaces */
  169.                         nxt_spaces = 0;
  170.                         while (1)
  171.                         {
  172.                             if ( *(src+nxt_spaces+1) == NUL ||
  173.                                 (*(src+nxt_spaces+1) != ' ' &&
  174.                                  *(src+nxt_spaces+1) != '\t'))
  175.                                 break;
  176.                             if (*(src+nxt_spaces+1) == ' ')
  177.                                 ++nxt_spaces;
  178.                             if (*(src+nxt_spaces+1) == '\t' || 
  179.                                  nxt_spaces == tab_size)
  180.                             {
  181.                                 nxt_spaces = tab_size;
  182.                                 break;
  183.                             }
  184.                         }
  185.                         if ((prv_spaces >= min_spaces || nxt_spaces == tab_size) &&
  186.                              quote_char == ' ' &&
  187.                              !del_tabs)
  188.                         {
  189.                             *(dst++) = '\t';
  190.                             prv_spaces = 0;
  191.                         }
  192.                         else
  193.                         {
  194.                             for (; prv_spaces > 0; prv_spaces--)
  195.                                 *(dst++) = ' ';
  196.                         }
  197.                     }
  198.                 }
  199.                 else
  200.                 {
  201.                     for (; prv_spaces > 0; prv_spaces--)
  202.                         *(dst++) = ' ';
  203.                     if (*src == '\b')
  204.                         col_in_tab -= 2;
  205.                     if (!escaped && protect_quotes)
  206.                     {
  207.                         if (*src == '\\')
  208.                             escaped = TRUE;
  209.                         if (*src == '"' || *src == '\'')
  210.                             if (quote_char == ' ')
  211.                                     quote_char = *src;
  212.                             else if (*src == quote_char)
  213.                                     quote_char = ' ';
  214.                     }
  215.                     else
  216.                         if (*src != '\r' && *src != '\n')
  217.                             escaped = FALSE;
  218.                             
  219.                     if (( *src == '\r' || *src == '\n') &&
  220.                         clip_lines && !escaped)
  221.                     {
  222.                         while (dst > out_line &&
  223.                               (*(dst-1) == ' ' || *(dst-1) == '\t'))
  224.                                     dst--;
  225.                         prv_spaces = 0;
  226.                     }
  227.                     *(dst++) = *src;
  228.                 }
  229.                 col_in_tab %= tab_size;
  230.                 ++src;
  231.             }
  232.             /* for cases where the last line of file has no newline */
  233.             if (clip_lines && !escaped)
  234.             {
  235.                 while (dst > out_line &&
  236.                       (*(dst-1) == ' ' || *(dst-1) == '\t'))
  237.                             dst--;
  238.                 prv_spaces = 0;
  239.             }
  240.             for (; prv_spaces > 0; prv_spaces--)
  241.                 *(dst++) = ' ';
  242.             *dst = NUL;
  243.             if(fputs(out_line,stdout) == EOF)
  244.                 fprintf(stderr, "Error writing output.\n");
  245.         }
  246.     }while(name!=NULL && *name!=NULL);
  247.  
  248.     FreeArgs(anchor);
  249.     CloseLibrary(UtilityBase);
  250.  
  251.     exit(0);
  252. }
  253.